package com.cty.twelfthDay;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

/*
* 以数组 intervals 表示若干个区间的集合，其中单个区间为 intervals[i] = [starti, endi] 。
* 请你合并所有重叠的区间，并返回 一个不重叠的区间数组，该数组需恰好覆盖输入中的所有区间 。
*
* */
public class Q_14 {
    public static void main(String[] args) {
        int[][] intervals = {{1,4},{4,5}};
        int[][] merges = merge(intervals);
        for (int[] merge: merges) {
            System.out.println(Arrays.toString(merge));
        }
    }

    // 力扣官方题解 排序 思路:先将数组按左端点排序 用merged作为结果 判断merged的最后一个元素的右端点是否在当前元素的左端点的前面
    // 如果在 则不存在重合区间 加入当前元素即可 如果在后面 则存在连续区间 我们只需要更新merged的最后一个元素的右端点即可
    // 时间复杂度O(NlogN)
    public static int[][] merge(int[][] intervals) {
        if (intervals == null || intervals.length == 0) return new int[0][2];
        // 将数组中的元素按左端点排序
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });

        ArrayList<int[]> merged = new ArrayList<>();
        for (int i = 0;i < intervals.length;i++) {
            if (merged.isEmpty() || merged.get(merged.size() - 1)[1] < intervals[i][0]) {
                merged.add(intervals[i]);
            } else {
                merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1],intervals[i][1]);
            }
        }
        return merged.toArray(new int[merged.size()][]);
    }
}
